package com.zhuqi.protocol;

import com.zhuqi.proto.cost.MessageProtocolBufEnum;
import com.zhuqi.session.messge.MessagePackage;
import io.netty.buffer.ByteBuf;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Optional;

/**
 * <p>类描述</p>
 * @author zhuqi
 * @since 2023/3/16 11:05
 */
@Slf4j
public class ProtocolUtil {

	/**
	 * 自定义协议
	 * @return
	 */
	public static void createProtocol(ByteBuf buffer , MessagePackage messagePackage) {
		// 1. 魔数 （4个字节）
		buffer.writeInt(9527);
		// 2. 版本号  （1个字节）
		buffer.writeByte(1);
		// 3. 序列化算法 0：jdk 1.json （1个字节） 2 protobuf
		buffer.writeByte(2);
		// 4. 指令类型 （4个字节）
		buffer.writeInt(messagePackage.getBusinessCode());
		// 5. 请求序号 （4个字节）
		buffer.writeInt(messagePackage.getOrderNum());
		// 6. 正文长度 （4个字节）
		buffer.writeInt(messagePackage.getData().length);
		// 7. 消息正文 （n个字节）
		buffer.writeBytes(messagePackage.getData());
	}

	/**
	 * protocolBuf解码
	 * @param out 数据链
	 * @param bytes 协议数据
	 * @param business 消息业务类型
	 */
	public static void protocolBufSerializeDecode(List<Object> out, byte[] bytes, int business) {
		Object apply = MessageProtocolBufEnum.getFunctionByCode(business).apply(bytes);
		out.add(apply);
		log.info("protocolBuf decode msg:{}", Optional.ofNullable(apply.toString()).orElse(""));
	}
}
